package com.chenzehe.alimama.html;

import java.util.concurrent.atomic.AtomicReference;

import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

/**
 * 运行时 WebDriver 基础类 Singleton
 * 
 * @author chenzehe
 * 
 */
public class RuntimeWebDriver {

	private static final AtomicReference<WebDriver> runtimeWebDriver = new AtomicReference<WebDriver>();

	public static WebDriver getRuntimeWebDriver() {
		if (runtimeWebDriver.get() == null) {
			setRuntimeWebDriver(new FirefoxDriver());
		}
		return runtimeWebDriver.get();
	}

	private RuntimeWebDriver() {
	}

	public static void setRuntimeWebDriver(WebDriver webDriver) {
		runtimeWebDriver.set(webDriver);
	}

	/**
	 * @return 当前运行的是哪种浏览器
	 */
	public static String getRuntimeBrowserName() {
		JavascriptExecutor javascriptExecutor = (JavascriptExecutor) getRuntimeWebDriver();
		return (String) javascriptExecutor.executeScript(initBrowserDetect()
				+ "return BrowserDetect.browser;");
	}

	/**
	 * @return 当前运行的浏览器的版本
	 */
	public static String getRuntimeBrowserVersion() {
		JavascriptExecutor javascriptExecutor = (JavascriptExecutor) getRuntimeWebDriver();
		return javascriptExecutor.executeScript(
				initBrowserDetect() + "return BrowserDetect.version;")
				.toString();
	}

	/**
	 * @return 当前运行的操作系统
	 */
	public static String getRuntimeOS() {
		JavascriptExecutor javascriptExecutor = (JavascriptExecutor) getRuntimeWebDriver();
		return (String) javascriptExecutor.executeScript(initBrowserDetect()
				+ "return BrowserDetect.OS;");
	}

	private static String initBrowserDetect() {
		return "var BrowserDetect = {"
				+ "  init: function () {"
				+ "    this.browser = this.searchString(this.dataBrowser) || 'An unknown browser';"
				+ "    this.version = this.searchVersion(navigator.userAgent)"
				+ "      || this.searchVersion(navigator.appVersion)"
				+ "      || 'an unknown version';"
				+ "    this.OS = this.searchString(this.dataOS) || 'an unknown OS';"
				+ "  },"
				+ "  searchString: function (data) {"
				+ "    for (var i=0;i<data.length;i++)  {"
				+ "      var dataString = data[i].string;"
				+ "      var dataProp = data[i].prop;"
				+ "      this.versionSearchString = data[i].versionSearch || data[i].identity;"
				+ "      if (dataString) {"
				+ "        if (dataString.indexOf(data[i].subString) != -1)"
				+ "          return data[i].identity;"
				+ "      }"
				+ "      else if (dataProp)"
				+ "        return data[i].identity;"
				+ "    }"
				+ "  },"
				+ "  searchVersion: function (dataString) {"
				+ "    var index = dataString.indexOf(this.versionSearchString);"
				+ "    if (index == -1) return;"
				+ "    return parseFloat(dataString.substring(index+this.versionSearchString.length+1));"
				+ "  }," + "  dataBrowser: [" + "    {"
				+ "      string: navigator.userAgent,"
				+ "      subString: 'Chrome'," + "      identity: 'Chrome'"
				+ "    }," + "    {   string: navigator.userAgent,"
				+ "      subString: 'OmniWeb',"
				+ "      versionSearch: 'OmniWeb/',"
				+ "      identity: 'OmniWeb'" + "    }," + "    {"
				+ "      string: navigator.vendor,"
				+ "      subString: 'Apple'," + "      identity: 'Safari',"
				+ "      versionSearch: 'Version'" + "    }," + "    {"
				+ "      prop: window.opera," + "      identity: 'Opera',"
				+ "      versionSearch: 'Version'" + "    }," + "    {"
				+ "      string: navigator.vendor,"
				+ "      subString: 'iCab'," + "      identity: 'iCab'"
				+ "    }," + "    {" + "      string: navigator.vendor,"
				+ "      subString: 'KDE'," + "      identity: 'Konqueror'"
				+ "    }," + "    {" + "      string: navigator.userAgent,"
				+ "      subString: 'Firefox'," + "      identity: 'Firefox'"
				+ "    }," + "    {" + "      string: navigator.vendor,"
				+ "      subString: 'Camino'," + "      identity: 'Camino'"
				+ "    }," + "    {" + "      string: navigator.userAgent,"
				+ "      subString: 'Netscape'," + "      identity: 'Netscape'"
				+ "    }," + "    {" + "      string: navigator.userAgent,"
				+ "      subString: 'MSIE'," + "      identity: 'Explorer',"
				+ "      versionSearch: 'MSIE'" + "    }," + "    {"
				+ "      string: navigator.userAgent,"
				+ "      subString: 'Gecko'," + "      identity: 'Mozilla',"
				+ "      versionSearch: 'rv'" + "    }," + "    {"
				+ "      string: navigator.userAgent,"
				+ "      subString: 'Mozilla'," + "      identity: 'Netscape',"
				+ "      versionSearch: 'Mozilla'" + "    }" + "  ],"
				+ "  dataOS : [" + "    {"
				+ "      string: navigator.platform,"
				+ "      subString: 'Win'," + "      identity: 'Windows'"
				+ "    }," + "    {" + "      string: navigator.platform,"
				+ "      subString: 'Mac'," + "      identity: 'Mac'"
				+ "    }," + "    {" + "         string: navigator.userAgent,"
				+ "         subString: 'iPhone',"
				+ "         identity: 'iPhone/iPod'" + "      }," + "    {"
				+ "      string: navigator.platform,"
				+ "      subString: 'Linux'," + "      identity: 'Linux'"
				+ "    }" + "  ]" + "};" + "BrowserDetect.init();";
	}
}
